package com.gwcloud.design.create.builder;

/** 
* @ClassName   : Outer 
* @author      : ganwei 
* @date        : 2020年7月12日 
* @Description : 静态内部类 
*/
public class Outer {
	private String str = "外部类种的字符串";
	private int num = 0;
	private static String sstr = "外部类静态成员字符串";
	
	//*****************************//
	//成员内部类
	//成员内部类是依附外部类的，只有创建了外部类才能创建内部类
	public class Inner{
		private String instr = "非静态内部类中的字符串";
		//定义一个内部类的方法
		public void print() {
			num = 1;
			System.out.println(str);
			System.out.println("num: " + num);
		}
	}
	
	public void test2() {
		Inner in = new Inner();
		in.print();
	}
	
	//*****************************//
	//静态内部类
	//非静态内部类在编译完成之后会隐含的保存着一个引用，该引用是指向创建它的外围类，但是静态类没有
	public static class StaInner{
		private String stainstr = "静态内部类的字符串";
		//定义一个内部类的方法
		public void sfun() {
			System.out.println(stainstr);
			System.out.println(sstr);
		}
	}
	
	
	//*****************************//
	//方法内部类
	//该形参必须使用final声明（JDK8形参变为隐式final声明）
	public void display(int temp) {
		
		class mInner{
			public void mfun() {
                System.out.println(num);
                System.out.println(temp);
			}
		}
		
		new mInner().mfun();
	}
	
	
	//*****************************//
	//匿名内部类
	public void display1(int temp) {
        //匿名内部类，匿名的实现了MyInterface接口
        //隐藏的class声明
        new MyInterface()
        {
        	@Override
            public void test()
            {
                System.out.println("匿名实现MyInterface接口");
                System.out.println(temp);
            }
        }.test();

	}
	
	//*****************************//
	//内部类与外部类的关系
	//对于非静态的内部类，内部类的创建依赖外部类的实例对象，在没有外部类实例之前是无法创建内部类的
	//内部类可以直接访问外部类的元素（包括私有域）—外部类在内部类之前创建，创建内部类时会将外部类的对象传入
	
	
	
	//*****************************//
	//在外部类中定义一个方法，该方法负责产生内部类对象并调用print()方法
	public void fun() {
		Inner in = new Inner();
		in.print();
	}
	
	public static void main(String[] args) {
		//内部类实验（非静态）
		Outer out = new Outer();
		out.fun();
		out.test2();
		
		//外部类外部，创建非静态内部类(非静态)
		Outer.Inner in = new Outer().new Inner();
		in.print();
		
		//匿名内部类实验
		out.display1(1);
		
	}
}
